package com.zenithmind.user.controller;

import com.zenithmind.common.annotation.Log;
import com.zenithmind.common.constant.OperationTypeEnum;
import com.zenithmind.user.pojo.domain.Permission;
import com.zenithmind.user.pojo.query.PermissionQuery;
import com.zenithmind.user.pojo.vo.PermissionVO;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;
import com.zenithmind.user.service.PermissionService;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/api/zenithMind/permission")
@Tag(name = "权限管理")
public class PermissionController {
    @Autowired
    private PermissionService permissionService;
    
    /**
     * 添加权限接口
     *
     * 该接口用于接收POST请求，以添加新的权限信息到系统中
     *
     * @param permission 权限对象，包含需要添加的权限信息，如权限名称、描述等
     * @return 返回执行结果，包括是否成功添加权限，以及添加的权限信息
     */
    @Log(description = "添加权限", operationType = OperationTypeEnum.ADD)
    @Operation(summary = "添加权限")
    @PostMapping("/addPermission")
    public Result<Permission> add(@RequestBody Permission permission) {
        // 保存权限信息到数据库
        permissionService.save(permission);
        // 返回成功结果及保存的权限信息
        return Result.success(permission);
    }
    
    /**
     * 修改权限信息
     *
     * 该方法通过PUT请求接收一个Permission对象，用于更新数据库中对应的权限信息
     * 主要用途是当权限信息发生变化时，通过此接口进行数据同步和更新
     *
     * @param permission 待更新的权限对象，包含需要修改的权限信息
     * @return 返回更新后的权限对象，表明修改操作成功
     */
    @Log(description = "修改权限信息", operationType = OperationTypeEnum.UPDATE)
    @Operation(summary = "修改权限")
    @PutMapping("/updatePermission")
    public Result<Permission> update(@RequestBody Permission permission) {
        permissionService.updateById(permission);
        return Result.success(permission);
    }
    
    /**
     * 删除指定的权限
     *
     * @param id 权限的唯一标识符
     * @return 返回操作结果的字符串信息
     */
    @Log(description = "删除权限", operationType = OperationTypeEnum.DELETE)
    @Operation(summary = "删除权限")
    @DeleteMapping("/deletePermission/{id}")
    public Result<String> delete(@PathVariable String id) {
        permissionService.removeById(id);
        return Result.success();
    }
    
    /**
     * 批量删除权限
     *
     * 该接口用于接收一个权限ID列表，并将这些权限从系统中删除
     * 主要用途是当需要同时移除多个权限时，减少请求次数，提高效率
     *
     * @param ids 要删除的权限ID列表
     * @return 返回操作结果，成功则返回成功信息
     */
    @Log(description = "批量删除权限", operationType = OperationTypeEnum.DELETE)
    @Operation(summary = "批量删除权限")
    @DeleteMapping("/batchDeletePermissions")
    public Result<String> deleteBatch(@RequestBody List<String> ids) {
        permissionService.removeBatchByIds(ids);
        return Result.success();
    }
    
    /**
     * 根据ID查询权限信息
     *
     * @param id 权限的唯一标识符
     * @return 包含权限详细信息的Result对象
     */
    @Log(description = "根据ID查询权限", operationType = OperationTypeEnum.QUERY)
    @Operation(summary = "根据ID查询权限")
    @GetMapping("/getPermissionById/{id}")
    public Result<PermissionVO> getById(@PathVariable String id) {
        return Result.success(permissionService.getPermissionById(id));
    }
    
    /**
     * 分页查询权限信息
     *
     * 该接口用于处理权限的分页查询请求，允许用户根据特定条件筛选权限信息，
     * 并以分页的形式返回查询结果，便于处理大量数据
     *
     * @param permissionQuery 权限查询对象，包含查询条件和分页参数
     * @return 返回包含分页结果的Result对象，其中PageResult<PermissionVO>
     *         包含了查询到的权限信息列表和分页相关数据
     */
    @Log(description = "分页查询权限", operationType = OperationTypeEnum.QUERY)
    @Operation(summary = "分页查询权限")
    @GetMapping("/pagePermissions")
    public Result<PageResult<PermissionVO>> page(PermissionQuery permissionQuery) {
        return Result.success(permissionService.page(permissionQuery));
    }
    
    /**
     * 获取权限树信息
     *
     * 通过GET请求调用此方法，返回系统的权限树结构
     * 主要用于展示权限的层级关系，以便于管理员进行权限管理
     *
     * @return 权限树的列表，以Result对象封装，表示操作成功并携带数据
     */
    @Log(description = "获取权限树", operationType = OperationTypeEnum.QUERY)
    @Operation(summary = "获取权限树")
    @GetMapping("/getPermissionTree")
    public Result<List<PermissionVO>> tree() {
        return Result.success(permissionService.getPermissionTree());
    }
    
    /**
     * 根据角色ID获取权限
     *
     * 此方法通过角色ID查询并返回相应的权限列表它使用GET请求，并从路径中获取角色ID作为参数
     *
     * @param roleId 角色ID，用于查询权限
     * @return 返回一个Result对象，其中包含权限列表
     */
    @Log(description = "根据角色ID获取权限", operationType = OperationTypeEnum.QUERY)
    @Operation(summary = "根据角色ID获取权限")
    @GetMapping("/getPermissionsByRoleId/{roleId}")
    public Result<List<PermissionVO>> getByRoleId(@PathVariable String roleId) {
        return Result.success(permissionService.getByRoleId(roleId));
    }
}
